/*******************************************
  Jose Andres Lara Vecino

  Author       : $Author: cainlara@gmail.com $
  Last CheckIn : $Date: 2012-10-29 19:04:52 +0000 (Mon, 29 Oct 2012) $
  Revision     : $Revision: 108 $
*******************************************/

package api.impl;

import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;

import persistencia.IAtributos;
import persistencia.TmGrupoUsuario;
import persistencia.TmUsuario;
import utilidad.Util;
import utilidad.UtilConversor;
import api.IUsuarioAPI;
import core.TestManagerException;
import dao.GrupoUsuariosDao;
import dao.UsuarioDao;
import frente.Usuario;
import generico.GenericoAPI;

/**
 * Controlador de acciones para Suites.
 * <P>
 * Esta clase, administra la informacion 
 * persistente de los objetos tipo <code>Usuario</code>.
 * 
 * @see UsuarioDao
 * @see TmUsuario
 * @see Usuario
 * 
 * @author jose.lara 06.06.2012
 */
public class UsuarioAPI extends GenericoAPI implements IUsuarioAPI {
    private static final long serialVersionUID = -434239692914947338L;
    
    private UsuarioDao dao = null;
    
    public UsuarioAPI() {
    }
    
    public UsuarioDao getDao() {
        if(dao == null) {
            dao = new UsuarioDao();
        }
        
        return dao;
    }
    
    @Override
    public List<Usuario> getTodosUsuarios() throws TestManagerException {
        List<TmUsuario> persistentes    = null;
        List<Usuario> usuarios          = null;
        Usuario usuario                 = null;
        
        persistentes = getDao().getResultFindAll();
        
        if(persistentes != null) {
            usuarios = new ArrayList<Usuario>();
            
            for(TmUsuario persistente : persistentes) {
                usuario = UtilConversor.convertir2Usuario(persistente);
                
                if(usuario != null) {
                    usuarios.add(usuario);
                }
            }
            
        }
        
        return usuarios;
    }
    
    @Override
    public Usuario getUsuario(String nombreUsuario) throws TestManagerException {
        Usuario usuario = null;
        TmUsuario persistente = null;
        
        persistente = getDao().getUsuarioByUserName(nombreUsuario);
        
        if(persistente != null) {
            usuario = UtilConversor.convertir2Usuario(persistente);
        }
        
        return usuario;
    }
    
    @Override
    public void eliminarUsuario(Usuario usuario) throws TestManagerException {
        TmUsuario persistente = null;
        persistente = getDao().getResultfindById(TmUsuario.class, usuario.getId());
        getDao().delete(persistente);
    }
    
    @Override
    public void guardarUsuario(Usuario usuario, boolean cambiarClave) throws TestManagerException, NoSuchAlgorithmException, UnsupportedEncodingException {
        TmUsuario persistente               = null;
        TmGrupoUsuario grupoUsuarios        = null;
        GrupoUsuariosDao grupoUsuariosDao   = null;
        Long llave                          = null;
        Long grupoUsuariosLLave             = null;
        
        llave = usuario.getId();
        
        if(llave == null) {
            persistente = new TmUsuario();
            persistente.setId(obtenerId("TmUsuario"));
            grupoUsuariosLLave = IAtributos.LLAVE_SIN_GUARDAR;
        }
        else {
            persistente = getDao().getResultfindById(TmUsuario.class, llave);
            grupoUsuariosLLave = persistente.getTmGrupoUsuario().getId();
        }
        
        if(cambiarClave) {
            persistente.setClave(encriptarClave(usuario.getClave()));
        }
        
        persistente.setCorreo(usuario.getCorreo());
        persistente.setNombre(usuario.getNombre());
        persistente.setNombreUsuario(usuario.getNombreUsuario());
        
        if(grupoUsuariosLLave.longValue() != usuario.getIdGrupoUsuarios().longValue()) {
            grupoUsuariosDao = new GrupoUsuariosDao();
            
            grupoUsuarios = grupoUsuariosDao.getResultfindById(TmGrupoUsuario.class, usuario.getIdGrupoUsuarios());
            persistente.setTmGrupoUsuario(grupoUsuarios);
        }
        
        getDao().save(persistente);
    }
    
    private static String encriptarClave(String clave) throws NoSuchAlgorithmException, UnsupportedEncodingException {
        String claveEncriptada = null;
        
        claveEncriptada = Util.getMD5(clave);
        
        return claveEncriptada;
    }
}